package com.tledu.httpclient;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * 工具类，通过工具类封装请求流程，方便我们使用
 */
public class HttpUtils {
    /**
     * 构建一个httpClent的对象，把他设置全局的静态变量,方便我们在任何地方使用它
     */
    private static final CloseableHttpClient httpClient;

    /**
     * 设置http client 也可以增加一些配置，基于我们特殊需求创建对象
     */
    static {
        // 静态代码块，在程序一家在的时候就会执行
        // 一般可以用于给静态变量进行初始化
        // 每次发送http请求的时候一般会一些特殊需求，就可以在这里配置了
        RequestConfig config = RequestConfig.custom().setConnectTimeout(20 * 1000).build();
        httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
    }

    /**
     * 封装get方法
     * 作用：
     * 模拟发送get请求
     * 输入
     * url
     * 请求的参数
     * 输出
     * 请求网站得到结果
     */
    public static String get(String url, List<NameValuePair> params) throws IOException {
        // HttpClient,提供了传递参数的工具
        url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(params), "utf8");
        // 1. 创建HttpClient
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 2. 创建请求,创建一个get请求
        HttpGet httpGet = new HttpGet(url);
        // 3. 通过httpclient 发送请求拿到对应的数据
        CloseableHttpResponse response = httpClient.execute(httpGet);
        // 拿到我们请求的响应的状态吗
        // 一般情况我们会根据这个状态码判断，请求是否成功
        int statusCode = response.getStatusLine().getStatusCode();

        String result = null;

        if (statusCode != 200){
            // 请求失败了
            httpGet.abort();
            System.out.println("请求失败");
        }else {
            // 请求成功
            // 获取响应体内容
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                // 拿到对应的数据
                result = EntityUtils.toString(entity, "utf8");
                // 释放资源
                EntityUtils.consume(entity);
                // 关闭响应
                response.close();
            }
        }
        return result;
    }

    public static String get(String url) throws IOException {
        return get(url, new ArrayList<>());
    }
}
